package com.sprouting.personal.service.core;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.sprouting.personal.interfaces.common.CacheKey;
import com.sprouting.personal.interfaces.common.Constant;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 获取权限和角色等信息，注意，每次权限都会调用，需要自己加缓存处理
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/7/27 0:47
 */
@Component
public class StpInterfaceService implements StpInterface {

    /**
     * 返回一个账号所拥有的权限码集合
     * @param loginId 登录ID
     * @param loginType 账号类型
     * @return
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        return getPermissionListSession();
    }

    /**
     * 返回一个账号所拥有的角色标识集合
     * @param loginId 登录ID
     * @param loginType 账号类型
     * @return
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        return getRoleListSession();
    }

    /**
     * 从session中获取权限
     * @return
     */
    private List<String> getPermissionListSession(){
        // 获取当前账号id的Session (必须是登录后才能调用)
        SaSession sessionUser = StpUtil.getSession();
        String powerJson = (String) sessionUser.get(CacheKey.SaTokenSession.SESSION_KEY_POWER);
        //如果没有数据，插入默认数据
        if (Constant.DefaultValue.STRING.equals(powerJson)){
            return new ArrayList<>();
        }
        if (StrUtil.isNotBlank(powerJson)){
            return JSONUtil.toList(powerJson, String.class);
        }

        return new ArrayList<>();
    }

    /**
     * 从session中获取角色
     * @return
     */
    private List<String> getRoleListSession(){
        // 获取当前账号id的Session (必须是登录后才能调用)
        SaSession sessionUser = StpUtil.getSession();
        String roleJson = (String) sessionUser.get(CacheKey.SaTokenSession.SESSION_KEY_ROLE);
        if (Constant.DefaultValue.STRING.equals(roleJson)){
            return new ArrayList<>();
        }
        if (StrUtil.isNotBlank(roleJson)){
            return JSONUtil.toList(roleJson, String.class);
        }

        return new ArrayList<>();
    }
}
